<?php

namespace App\Traits;

use Overtrue\Pinyin\Pinyin;
use Illuminate\Database\Eloquent\Model;

trait HasUniqueSlug
{
    /**
     * 在模型创建或更新时自动生成唯一的 slug
     *
     * @return void
     */
    protected static function bootHasUniqueSlug()
    {
        // 监听模型创建事件
        static::creating(function (Model $model) {
            $name = $model->name ?? $model->title;
            if ($name) {
                $model->slug = self::generateUniqueSlug($name, null);
            }
        });

        // 监听模型更新事件
        static::updating(function (Model $model) {
            // 只有当 name 或 title 字段被修改时才重新生成 slug
            if ($model->isDirty('name') || $model->isDirty('title')) {
                $name = $model->name ?? $model->title;
                if ($name) {
                    $model->slug = self::generateUniqueSlug($name, $model->id);
                }
            }
        });
    }

    /**
     * 根据给定名称生成唯一的 slug
     *
     * @param string $name
     * @param int|null $ignoreId
     * @return string
     */
    protected static function generateUniqueSlug(string $name, ?int $ignoreId)
    {
        $pinyin = new Pinyin();
        $baseSlug = $pinyin->permalink($name);
        $slug = $baseSlug;
        $count = 2;

        // 构建查询，检查 slug 是否已存在
        $query = self::where('slug', $slug);
        if ($ignoreId) {
            $query->where('id', '!=', $ignoreId);
        }

        // 如果存在，在后面添加数字直到唯一
        while ($query->exists()) {
            $slug = $baseSlug . '-' . $count++;
            $query = self::where('slug', $slug);
            if ($ignoreId) {
                $query->where('id', '!=', $ignoreId);
            }
        }

        return $slug;
    }
}